/*!
\file Action.cpp
\brief Implementation of Action subclasses.
\ingroup Action
*/

#include"Action.h" 

NodeAction::NodeAction( int nodeID, QString nodeLabel ){
	m_nodeID = nodeID;
	m_nodeLabel = nodeLabel;
}

/*====================================================================================================*/

NodeAccessAction::NodeAccessAction( int nodeID ):NodeAction( nodeID ){
	
}

void NodeAccessAction::exec( ActionCommunicator *communicator ){
	communicator->nodeAccess(m_nodeID);
}

/*====================================================================================================*/

NodeAddAction::NodeAddAction( int nodeID, QString nodeLabel, bool isUninteresting ): NodeAction( nodeID, nodeLabel ){
	m_isUninteresting = isUninteresting;
}

void NodeAddAction::exec( ActionCommunicator *communicator ){
	communicator->addNode( QString().setNum(m_nodeID) + QString( " [label=\"" ) + m_nodeLabel + QString("\"];") );
}

/*====================================================================================================*/

NodeRemoveAction::NodeRemoveAction( int nodeID ): NodeAction( nodeID ){

}

void NodeRemoveAction::exec( ActionCommunicator *communicator ){
	communicator->removeNode( m_nodeID );
}

/*====================================================================================================*/

NodeHighlightAction::NodeHighlightAction( int nodeID ): NodeAction( nodeID ){
	
}

void NodeHighlightAction::exec( ActionCommunicator *communicator ){
	communicator->setNodeOption( m_nodeID, "color", communicator->settings()->highlightColour() );
}

/*====================================================================================================*/

NodeUnHighlightAction::NodeUnHighlightAction( int nodeID ): NodeAction( nodeID ){

}

void NodeUnHighlightAction::exec( ActionCommunicator *communicator ){
	communicator->setNodeOption( m_nodeID, "color", "" );//TODO: Verify this works properly
}

/*====================================================================================================*/

EdgeAction::EdgeAction( int edgeID, int from, int to, QString edgeLabel ){
	m_id = edgeID;
	m_from = from;
	m_to = to;
	m_edgeLabel = edgeLabel;
}

/*====================================================================================================*/

EdgeAccessAction::EdgeAccessAction( int edgeID, int from, int to, QString edgeLabel ):EdgeAction(edgeID, from, to, edgeLabel){
	
}

void EdgeAccessAction::exec( ActionCommunicator *communicator ){
	communicator->edgeAccess( m_id );
}

/*====================================================================================================*/

EdgeAddAction::EdgeAddAction( int edgeID, int from, int to, QString edgeLabel, bool isUninteresting ): EdgeAction( edgeID, from, to, edgeLabel ){
	m_isUninteresting = isUninteresting;
}

void EdgeAddAction::exec( ActionCommunicator *communicator ){
	communicator->addEdge( QString().setNum(m_from) + QString(" -- ") + QString().setNum(m_to) + QString( " [label=\"" ) + QString().setNum(m_id) + ":" + m_edgeLabel + QString("\"];") );
}

/*====================================================================================================*/

EdgeRemoveAction::EdgeRemoveAction( int edgeID, int from, int to, QString edgeLabel ):EdgeAction( edgeID, from, to, edgeLabel ){

}

void EdgeRemoveAction::exec( ActionCommunicator *communicator ){
	communicator->removeEdge( m_id );
}

/*====================================================================================================*/

EdgeHighlightAction::EdgeHighlightAction( int edgeID ):EdgeAction(edgeID, 0, 0, ""){
	
}

void EdgeHighlightAction::exec( ActionCommunicator *communicator ){
	communicator->setEdgeOption( m_id, "color", communicator->settings()->highlightColour() );
}

/*====================================================================================================*/

EdgeUnHighlightAction::EdgeUnHighlightAction(int edgeID): EdgeAction(edgeID, 0, 0, ""){

}

void EdgeUnHighlightAction::exec( ActionCommunicator *communicator ){
	communicator->setEdgeOption( m_id, "color", "" );//TODO verify this works
}

/*====================================================================================================*/

ContainerRemoveAction::ContainerRemoveAction( int containerID ){
	m_containerID = containerID;
}

void ContainerRemoveAction::exec( ActionCommunicator *communicator ){
	communicator->removeContainer( m_containerID );
}

/*====================================================================================================*/

ContainerElementAction::ContainerElementAction( int container, int element ){
	m_container = container;
	m_element = element;
}

/*====================================================================================================*/

ContainerElementAddAction::ContainerElementAddAction( int container, int element ):ContainerElementAction( container, element ){

}

void ContainerElementAddAction::exec( ActionCommunicator *communicator ){
	if( communicator->settings()->containerSettings(m_container) & CVIS_TABLE_VALUE )
		communicator->containerNewElement(m_container, m_element);
}

/*====================================================================================================*/

ContainerElementRemoveAction::ContainerElementRemoveAction( int container, int element ):ContainerElementAction( container, element ){

}

void ContainerElementRemoveAction::exec( ActionCommunicator *communicator ){
	if( communicator->settings()->containerSettings(m_container) & CVIS_TABLE_VALUE )
		communicator->containerRemoveElement(m_container, m_element);
}

/*====================================================================================================*/

ContainerElementSetNodeAction::ContainerElementSetNodeAction( int container, int element, int nodeID, QString nodeLabel ):ContainerElementAction( container, element ){
	m_nodeID = nodeID;
	m_nodeLabel = nodeLabel;
}

void ContainerElementSetNodeAction::exec( ActionCommunicator *communicator ){
	
	if( communicator->settings()->containerSettings(m_container) & CVIS_COLOUR_NODE ){
		communicator->setNodeOption( m_nodeID, "color", communicator->settings()->containerColour(m_container) );
	}
	
	if( communicator->settings()->containerSettings(m_container) & CVIS_TABLE_VALUE ){
		communicator->containerSetNode(m_container, m_element, m_nodeID, m_nodeLabel);
	}
}

/*====================================================================================================*/

ContainerElementRemoveNodeAction::ContainerElementRemoveNodeAction( int container, int element, int nodeID, QString nodeLabel ):ContainerElementAction( container, element ){
	m_nodeID = nodeID;
	m_nodeLabel = nodeLabel;
}

void ContainerElementRemoveNodeAction::exec( ActionCommunicator *communicator ){
	
	if( communicator->settings()->containerSettings(m_container) & CVIS_COLOUR_NODE ){
		communicator->setNodeOption( m_nodeID, "color", "" );
	}
	
	if( communicator->settings()->containerSettings(m_container) & CVIS_TABLE_VALUE ){
		communicator->containerSetNode(m_container, m_element, -1);
	}
}

/*====================================================================================================*/

ContainerElementSetEdgeAction::ContainerElementSetEdgeAction( int container, int element, int edgeID, int from, int to, QString edgeLabel ):ContainerElementAction( container, element ){
	m_id = edgeID;
	m_from = from;
	m_to = to;
	m_edgeLabel = edgeLabel;
}

void ContainerElementSetEdgeAction::exec( ActionCommunicator *communicator ){
	if( communicator->settings()->containerSettings(m_container) & CVIS_COLOUR_NODE )
		communicator->setEdgeOption( m_id, "color", communicator->settings()->containerColour(m_container) );
	if( communicator->settings()->containerSettings(m_container) & CVIS_TABLE_VALUE )
		communicator->containerSetEdge(m_container, m_element, m_from, m_to, m_edgeLabel);
}

/*====================================================================================================*/

ContainerElementRemoveEdgeAction::ContainerElementRemoveEdgeAction( int container, int element, int edgeID, int from, int to, QString edgeLabel ):ContainerElementAction( container, element ){
	m_id = edgeID;
	m_from = from;
	m_to = to;
	m_edgeLabel = edgeLabel;
}

void ContainerElementRemoveEdgeAction::exec( ActionCommunicator *communicator ){
	if( communicator->settings()->containerSettings(m_container) & CVIS_COLOUR_NODE )
		communicator->setEdgeOption( m_id, "color", "" );
	if( communicator->settings()->containerSettings(m_container) & CVIS_TABLE_VALUE )
		communicator->containerSetEdge(m_container, m_element, -1, -1, "");
}

/*====================================================================================================*/

ContainerElementSetDataAction::ContainerElementSetDataAction( int container, int element, QString data ):ContainerElementAction( container, element ){
	m_data = data;
}

void ContainerElementSetDataAction::exec( ActionCommunicator *communicator ){
	if( communicator->settings()->containerSettings(m_container) & CVIS_TABLE_VALUE )
		communicator->containerSetData(m_container, m_element, m_data);
}

/*====================================================================================================*/

CommentAction::CommentAction( QString comment ){
	m_comment = comment;
}

void CommentAction::exec( ActionCommunicator *communicator ){
	communicator->comment( m_comment );
}





